import { useMemo } from 'react';
import useUser from './useUser';

/**
 * 权限检查 Hook
 * 用于检查用户是否拥有特定的权限
 */
const usePermission = () => {
  const { userInfo } = useUser();

  /**
   * 检查用户是否拥有指定的权限
   * @param permission 要检查的权限
   * @returns 用户是否拥有该权限
   */
  const hasPermission = useMemo(() => {
    return (permission: string): boolean => {
      // 如果用户是管理员，默认拥有所有权限
      if (userInfo?.userType === 'admin') {
        return true;
      }
      
      // 检查用户的权限列表中是否包含该权限
      return userInfo?.permissions?.includes(permission) || false;
    };
  }, [userInfo?.permissions, userInfo?.userType]);

  /**
   * 检查用户是否拥有指定的任一权限
   * @param permissions 要检查的权限列表
   * @returns 用户是否拥有任一权限
   */
  const hasAnyPermission = useMemo(() => {
    return (permissions: string[]): boolean => {
      // 如果用户是管理员，默认拥有所有权限
      if (userInfo?.userType === 'admin') {
        return true;
      }
      
      // 检查用户的权限列表中是否包含任一指定权限
      return permissions.some(permission => 
        userInfo?.permissions?.includes(permission) || false
      );
    };
  }, [userInfo?.permissions, userInfo?.userType]);

  /**
   * 检查用户是否拥有指定的所有权限
   * @param permissions 要检查的权限列表
   * @returns 用户是否拥有所有权限
   */
  const hasAllPermissions = useMemo(() => {
    return (permissions: string[]): boolean => {
      // 如果用户是管理员，默认拥有所有权限
      if (userInfo?.userType === 'admin') {
        return true;
      }
      
      // 检查用户的权限列表中是否包含所有指定权限
      return permissions.every(permission => 
        userInfo?.permissions?.includes(permission) || false
      );
    };
  }, [userInfo?.permissions, userInfo?.userType]);

  /**
   * 检查用户是否属于指定的角色
   * @param role 要检查的角色
   * @returns 用户是否属于该角色
   */
  const hasRole = useMemo(() => {
    return (role: 'admin' | 'merchant' | 'user'): boolean => {
      return userInfo?.userType === role;
    };
  }, [userInfo?.userType]);

  return {
    hasPermission,
    hasAnyPermission,
    hasAllPermissions,
    hasRole,
    userType: userInfo?.userType,
    permissions: userInfo?.permissions || [],
  };
};

export default usePermission;